#include <iostream>
#include <cstring>

using namespace std;

class mystring {
private: 
    char* str;
    size_t length;

public:
    // 构造函数
    mystring(const char* s = ""){
        length = strlen(s);
        str = new char[length + 1];
        strcpy(str, s);
    }

    // 拷贝构造函数
    mystring(const mystring& other){
        length = other.length;
        str = new char[length + 1];
        strcpy(str, other.str);
    }

    // 析构函数，在对象销毁时释放动态分配的内存
    ~mystring() {
        delete[] str;
    }

    // 重载赋值运算符 =，用于将一个 mystring 对象的值赋给另一个对象
    mystring& operator=(const mystring& other) {
        if (this != &other) {
            delete[] str;
            length = other.length;
            str = new char[length + 1];
            strcpy(str, other.str);
        }
        return *this;
    }

    // 重载加法运算符 +，用于实现两个 mystring 对象的拼接
    mystring operator+(const mystring& other) const {
        char* temp = new char[length + other.length + 1];
        strcpy(temp, str);
        strcat(temp, other.str);
        mystring result(temp);
        delete[] temp;
        return result;
    }

    // 重载小于运算符 <，用于比较两个 mystring 对象的大小
    bool operator<(const mystring& other) const {
        return strcmp(str, other.str) < 0;
    }

    bool operator>(const mystring& other) const {
        return strcmp(str, other.str) > 0;
    }

    // 重载相等运算符 ==，用于比较两个 mystring 对象的大小
    bool operator==(const mystring& other) const {
        return strcmp(str, other.str) == 0;
    }

    // 重载输出运算符 <<
    friend ostream& operator<<(ostream& os, const mystring& s) {
        os << s.str;
        return os;
    }
};

int main() {
    // 字符串类运算符重载测试
    cout << "\n字符串类运算符重载测试：" << endl;
    // 创建 mystring 对象 s1，内容为 "Hello"
    mystring s1("Hello");
    // 创建 mystring 对象 s2，内容为 " World"
    mystring s2(" World");
    // 使用重载的加法运算符将 s1 和 s2 拼接，结果存储在 s3 中
    mystring s3 = s1 + s2;
    // 输出拼接结果
    cout << "拼接结果: " << s3 << endl;

    // 创建 mystring 对象 s4，内容为 "Hello"
    mystring s4("Hello");
    // 使用重载的相等运算符比较 s1 和 s4 是否相等
    if (s1 == s4) {
        // 若相等，输出相应信息
        cout << "两个字符串相等" << endl;
    }

    // 使用重载的小于运算符比较 s1 和 s2 的大小
    if (s1 < s2) {
        // 若 s1 小于 s2，输出相应信息
        cout << s1 << " 小于 " << s2 << endl;
    }

    return 0;
}    